library(dplyr) # manipular tablas de datos
library(sf) #manipular objetos espaciales
library(openxlsx) # trabajar con archivos Excel
library(ggplot2) # graficos estáticos
library(plotly) # gráficos dinámicos12 Dataframes y Delitos en R
Flujo de Trabajo de Indicadores de Delincuencia

12.1 Introducción
En esta sessión se realizará un flujo de trabajo de construcción de un indicador territorial de delitos a nivel comuna utilizando R. Que contempla desde la lectura de la base de información (excel de delitos), agregar información de categorías, hacer filtros, resúmenes estadísticos (tablas dinámicas) y finalmente visualizaciones gráficas y espaciales.
12.2 Librerías
12.3 Lectura de una tabla
Se leerá el archivo excel que se vio la semana pasada de delitos comunales.
delitos_tbl <- read.xlsx("data/excel/delitos_comunales.xlsx")
# str(delitos_tbl)ver los primeros 6 registros
head(delitos_tbl) REGION NOM_REGION PROVINCIA NOM_PROVIN COMUNA
1 05 REGIÓN DE VALPARAÍSO 056 SAN ANTONIO 05602
2 13 REGIÓN METROPOLITANA DE SANTIAGO 135 MELIPILLA 13502
3 08 REGIÓN DEL BIOBÍO 083 BIOBÍO 08314
4 01 REGIÓN DE TARAPACÁ 011 IQUIQUE 01107
5 03 REGIÓN DE ATACAMA 033 HUASCO 03302
6 10 REGIÓN DE LOS LAGOS 102 CHILOÉ 10202
NOM_COMUNA PERSONAS Tipo.Participante Subgrupo HOMBRE_delitos
1 ALGARROBO 13794 VICTIMA Abigeato 0
2 ALHUÉ 6365 VICTIMA Abigeato 1
3 ALTO BIOBÍO 5823 VICTIMA Abigeato 2
4 ALTO HOSPICIO 106297 VICTIMA Abigeato 0
5 ALTO DEL CARMEN 5280 VICTIMA Abigeato 0
6 ANCUD 38845 VICTIMA Abigeato 9
MUJER_delitos TOTAL_delitos
1 0 0
2 0 1
3 3 5
4 0 0
5 0 0
6 1 10
12.4 Agregar Categoría
Categorizar los Delitos:
Primeros veremos los tipos de delitos que existen, contenidos en la columna Subgrupo:
unique(delitos_tbl$Subgrupo)[1] "Abigeato" "Abusos sexuales"
[3] "Amenazas con armas" "Amenazas o riña"
[5] "Animales sueltos en la vía pública" "Auxilio al suicidio"
- Se muestran los primeros 6 solo para buena visualización en el libro digital, en la práctica deben existir 50 categorias de delitos.
Crear una categoría de delitos
Se debe crear un grupo de delitos de su interés (Puede elegir los que usted quiera). Para este ejemplo se seleccionarán los delitos de violentos.
#guardo los delitos violentos en un vector
d_agrupados <- c( "Lesiones graves o gravísimas", "Lesiones menos graves",
"Microtráfico de sustancias", "Otros homicidios",
"Robo con homicidio", "Robo violento de vehículo motorizado",
"Robos con violencia o intimidación", "Tráfico de sustancias")
# leves o incivilidades
# d_agrupados <- c( "Amenazas con armas", "Amenazas o riña",
# "Desórdenes públicos", "Comercio ilegal" ,
# "Consumo de alcohol y drogas en la vía pública",
# "Daños", "Lesiones leves" , "Desórdenes públicos",
# "Desórdenes públicos", "Ofensas al pudor",
# "Porte de arma cortante o punzante","Receptación",
# "Robo de objetos de o desde vehículo",
# "Robo por sorpresa" )Agregar Categoría de delitos
Para esto crearemos una nueva columna con la función mutate()
delitos_tbl <- delitos_tbl %>%
mutate(grupo = ifelse(Subgrupo %in% d_agrupados, TRUE, FALSE))
# head(delitos_tbl)
count(delitos_tbl, grupo) grupo n
1 FALSE 28980
2 TRUE 5520
dim(delitos_tbl)[1] 34500 13
12.5 Filtros
Filtrar por Tipo de Participante
delitos_filtered <- delitos_tbl %>%
filter(Tipo.Participante == "VICTIMA")Filtrar por Región
delitos_filtered <- delitos_filtered %>%
filter(NOM_REGION == "REGIÓN DE LA ARAUCANÍA")Filtrar por Categortía
delitos_filtered <- delitos_filtered %>%
filter(grupo == T)12.6 Generar Resúmenes (similar a tablas dinámicas)

tabla_resumen <- delitos_filtered %>%
group_by(NOM_COMUNA) %>%
summarise(total_delitos = sum(TOTAL_delitos),
pob = min(PERSONAS))
tabla_resumen# A tibble: 32 × 3
NOM_COMUNA total_delitos pob
<chr> <dbl> <dbl>
1 ANGOL 147 52958
2 CARAHUE 38 24458
3 CHOLCHOL 33 11581
4 COLLIPULLI 108 24439
5 CUNCO 19 17275
6 CURACAUTÍN 33 17253
7 CURARREHUE 13 7361
8 ERCILLA 53 7704
9 FREIRE 67 24390
10 GALVARINO 31 11914
# ℹ 22 more rows
Ponderar por población
tabla_resumen <- tabla_resumen %>%
mutate(pond_poblacion = total_delitos / pob) %>%
mutate(del_10000_hab = pond_poblacion * 10000) %>%
mutate(del_10000_hab = round(del_10000_hab,2)) # redondear con 2 decimales
head(tabla_resumen)# A tibble: 6 × 5
NOM_COMUNA total_delitos pob pond_poblacion del_10000_hab
<chr> <dbl> <dbl> <dbl> <dbl>
1 ANGOL 147 52958 0.00278 27.8
2 CARAHUE 38 24458 0.00155 15.5
3 CHOLCHOL 33 11581 0.00285 28.5
4 COLLIPULLI 108 24439 0.00442 44.2
5 CUNCO 19 17275 0.00110 11
6 CURACAUTÍN 33 17253 0.00191 19.1
12.7 Visualización gráfica
library(ggplot2)g_barra <- ggplot(tabla_resumen, aes(x = NOM_COMUNA, y = del_10000_hab)) +
geom_bar(fill = "#6a51a3", color = "gray90", stat = "identity", width = 0.7)+
coord_flip()+
theme_bw()+
labs(title="Delitos Violentos en la Región de la Araucanía",
y ="Delitos Violentos / 10000 hebitantes", x = "Nombre de Comuna")+
theme(plot.title = element_text(face = "bold",colour= "gray20", size=12))
g_barra
Guardar el gráfico de barras como imagen
ggsave(plot = g_barra, filename = "images/del_violentos_R09.png", width = 8, height = 7)Generar gráfico dinámico
library(plotly)ggplotly(g_barra)12.8 Visualización Espacial
Primero se debe unir la tabla resumen delitos con Shapefile de comunas del INE.
Leer Shapefile de comunas
comunas_r09 <- st_read("data/shape/Comunas_Chile.shp") %>%
filter(NOM_REGION == "REGIÓN DE LA ARAUCANÍA")Reading layer `Comunas_Chile' from data source
`/Users/denisberroeta/Library/CloudStorage/OneDrive-UniversidadAdolfoIbanez/CIT/DOCENCIA/DIPLOMADOS/DEDT_book/data/shape/Comunas_Chile.shp'
using driver `ESRI Shapefile'
Simple feature collection with 346 features and 9 fields
Geometry type: MULTIPOLYGON
Dimension: XY
Bounding box: xmin: -3701691 ymin: 3734031 xmax: 705926.2 ymax: 8065316
Projected CRS: WGS 84 / UTM zone 19S
head(comunas_r09)Simple feature collection with 6 features and 9 fields
Geometry type: MULTIPOLYGON
Dimension: XY
Bounding box: xmin: 105710.9 ymin: 5678347 xmax: 264088.7 ymax: 5814662
Projected CRS: WGS 84 / UTM zone 19S
OBJECTID REGION NOM_REGION PROVINCIA NOM_PROVIN COMUNA NOM_COMUNA
1 196 09 REGIÓN DE LA ARAUCANÍA 091 CAUTÍN 09102 CARAHUE
2 197 09 REGIÓN DE LA ARAUCANÍA 091 CAUTÍN 09116 SAAVEDRA
3 198 09 REGIÓN DE LA ARAUCANÍA 091 CAUTÍN 09121 CHOLCHOL
4 199 09 REGIÓN DE LA ARAUCANÍA 091 CAUTÍN 09106 GALVARINO
5 200 09 REGIÓN DE LA ARAUCANÍA 092 MALLECO 09211 VICTORIA
6 201 09 REGIÓN DE LA ARAUCANÍA 092 MALLECO 09202 COLLIPULLI
Shape_Leng Shape_Area geometry
1 2.906029 0.13808364 MULTIPOLYGON (((121386.1 57...
2 1.208166 0.04046546 MULTIPOLYGON (((116508.5 57...
3 1.231271 0.04440834 MULTIPOLYGON (((154657.2 57...
4 1.466943 0.05865461 MULTIPOLYGON (((169736.5 57...
5 2.049851 0.12969648 MULTIPOLYGON (((200422.2 57...
6 2.832457 0.13410231 MULTIPOLYGON (((195536.1 58...
Unir shafile con tabla resumen
Se utilizará la función left_join
comunas_r09 <- comunas_r09 %>%
left_join(tabla_resumen, by = "NOM_COMUNA")
head(comunas_r09)Simple feature collection with 6 features and 13 fields
Geometry type: MULTIPOLYGON
Dimension: XY
Bounding box: xmin: 105710.9 ymin: 5678347 xmax: 264088.7 ymax: 5814662
Projected CRS: WGS 84 / UTM zone 19S
OBJECTID REGION NOM_REGION PROVINCIA NOM_PROVIN COMUNA NOM_COMUNA
1 196 09 REGIÓN DE LA ARAUCANÍA 091 CAUTÍN 09102 CARAHUE
2 197 09 REGIÓN DE LA ARAUCANÍA 091 CAUTÍN 09116 SAAVEDRA
3 198 09 REGIÓN DE LA ARAUCANÍA 091 CAUTÍN 09121 CHOLCHOL
4 199 09 REGIÓN DE LA ARAUCANÍA 091 CAUTÍN 09106 GALVARINO
5 200 09 REGIÓN DE LA ARAUCANÍA 092 MALLECO 09211 VICTORIA
6 201 09 REGIÓN DE LA ARAUCANÍA 092 MALLECO 09202 COLLIPULLI
Shape_Leng Shape_Area total_delitos pob pond_poblacion del_10000_hab
1 2.906029 0.13808364 38 24458 0.001553684 15.54
2 1.208166 0.04046546 32 12380 0.002584814 25.85
3 1.231271 0.04440834 33 11581 0.002849495 28.49
4 1.466943 0.05865461 31 11914 0.002601981 26.02
5 2.049851 0.12969648 107 34103 0.003137554 31.38
6 2.832457 0.13410231 108 24439 0.004419166 44.19
geometry
1 MULTIPOLYGON (((121386.1 57...
2 MULTIPOLYGON (((116508.5 57...
3 MULTIPOLYGON (((154657.2 57...
4 MULTIPOLYGON (((169736.5 57...
5 MULTIPOLYGON (((200422.2 57...
6 MULTIPOLYGON (((195536.1 58...
12.8.1 Generar Mapa
library(viridis)
del_r09_m <- ggplot() +
geom_sf(data = comunas_r09, aes(fill = del_10000_hab), alpha=0.8, size= 0.5)+
scale_fill_viridis_c()+
ggtitle("Delitos Violentos en la Región de la Araucanía" ) +
theme_bw() +
# theme(legend.position="none")+
theme(panel.grid.major = element_line(colour = "gray80"),
panel.grid.minor = element_line(colour = "gray80"))
del_r09_m
Guardar el Mapa como imagen
ggsave(plot = del_r09_m, filename = "images/map_del_violentos_R09.png", width = 8, height = 7)Mapa Dinámico
library(mapview)
mapview(comunas_r09, zcol = "del_10000_hab", alpha.regions = 0.9)12.9 Guardar Resultados
# Excel
write.xlsx(tabla_resumen, file = "data/excel/R09_del_violentos.xlsx")
# Shapefile
st_write(comunas_r09, "data/shape/R09_del_violentos.shp", delete_dsn = T)
# rds
saveRDS(object = comunas_r09,file = "data/rds/R09_del_violentos.rds")